package main

import (
	"reflect"

	"github.com/labstack/echo/v4"
	"gorm.io/gorm"
)

func newDBSession(c echo.Context) *gorm.DB {
	// 每个请求都应该使用独立的 DB Session 处理
	db := DB.WithContext(c.Request().Context())
	if Config.Debug {
		return db.Debug()
	}
	return db
}

// 使用 method 当做 handler 注册路由时，应当使用这个反射包装。
// 注意事项：
// 1、方法需要是 exported 的
// 2、未匹配到的函数会直接 panic 报错
// 3、someType 必须是 struct 不能是 *struct， receiver 必须是 *struct
func MethodWrapper(someType interface{}) func(method string) echo.HandlerFunc {
	t := reflect.TypeOf(someType)
	return func(method string) echo.HandlerFunc {
		return func(c echo.Context) error {
			v := reflect.New(t)
			m, _ := v.Type().MethodByName(method)
			rs := m.Func.Call([]reflect.Value{v, reflect.ValueOf(c)})
			r := rs[0].Interface()
			if r != nil {
				return r.(error)
			} else {
				return nil
			}
		}
	}
}
